package org.lixue.common.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.InputStreamReader;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JsonUtils。
 */
public class JsonUtil {

    /**
     * 防止被实例化
     */
    private JsonUtil() {
    }

    private static Gson buildGson() {
        return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    }

    /**
     * Object转换为json格式字符串
     *
     * @param obj 要转换的Object
     * @return json格式字符串
     */
    public static String toJson(Object obj) {
        return buildGson().toJson(obj);
    }

    /**
     * json格式字符串转换为Object
     *
     * @param jsonString json格式字符串
     * @param toClass    目标类
     * @param <T>        T Class类
     * @return T类型的对象
     */
    public static <T> T toObject(String jsonString, Class<T> toClass) {
        return buildGson().fromJson(jsonString, toClass);
    }

    /**
     * json字符串转换为<i>raw</i>类的对象。
     *
     * @param jsonString json格式字符串
     * @param raw        目标类
     * @param args       Type数组s
     * @param <T>        泛型
     * @return T类型对象
     */
    public static <T> T toObject(String jsonString, final Class raw, final Type... args) {
        Type type = new ParameterizedType() {
            public Type getRawType() {
                return raw;
            }

            public Type[] getActualTypeArguments() {
                return args;
            }

            public Type getOwnerType() {
                return null;
            }
        };

        return buildGson().fromJson(jsonString, type);
    }

    /**
     * json字符串转换为<i>raw</i>类的对象。
     *
     * @param jsonString json格式字符串
     * @param raw        目标类
     * @param args       Type数组s
     * @param <T>        泛型
     * @return T类型对象
     */
    public static <T> T toObject(InputStreamReader jsonString, final Class raw, final Type... args) {
        Type type = new ParameterizedType() {
            public Type getRawType() {
                return raw;
            }

            public Type[] getActualTypeArguments() {
                return args;
            }

            public Type getOwnerType() {
                return null;
            }
        };

        return buildGson().fromJson(jsonString, type);
    }

    /**
     * json字符串转换为List，value是泛型T的对象
     *
     * @param jsonString json格式字符串
     * @param toClass    List的value类型
     * @param <T>        toClass的泛型类型
     * @return Map对象
     */
    public static <T> List<T> toList(String jsonString, Class<T> toClass) {
        return toObject(jsonString, ArrayList.class, toClass);
    }

    /**
     * json字符串转换为Map，value是泛型T的对象
     *
     * @param jsonString json格式字符串
     * @param toClass    Map的value类型
     * @param <T>        toClass的泛型类型
     * @return Map对象
     */
    public static <T> Map<String, T> toMap(String jsonString, Class<T> toClass) {
        return toObject(jsonString, HashMap.class, String.class, toClass);
    }
}